<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
    <title>Reference</title>
    <link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>

<div id="container">

<div id="product">
	<div id="product_logo"></div>
	<div id="product_name"><big><b></b></big></div>
	<div id="product_description"></div>
</div> <!-- id="product" -->


<div id="main">


<!-- Menu -->

<div id="navigation">
<br/>
<h1>Duplex</h1>

<ul>
  <li><a href="../index.html">Index</a></li>
</ul>

<h2>Contents</h2>
<ul>
<li><a href="#Functions">Functions</a></li>
<li><a href="#Tables">Tables</a></li>
<li><a href="#Fields">Fields</a></li>
</ul>


<h2>Modules</h2>
<ul class="$(kind=='Topics' and '' or 'nowrap'">
  <li><a href="../modules/Duplex.Application.html">Duplex.Application</a></li>
  <li><a href="../modules/Duplex.Applications.Effect.html">Duplex.Applications.Effect</a></li>
  <li><a href="../modules/Duplex.Applications.GridPie.html">Duplex.Applications.GridPie</a></li>
  <li><a href="../modules/Duplex.Applications.Hydra.html">Duplex.Applications.Hydra</a></li>
  <li><a href="../modules/Duplex.Applications.Instrument.html">Duplex.Applications.Instrument</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.GridLayout.html">Duplex.Applications.Keyboard.GridLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.HarmonicLayout.html">Duplex.Applications.Keyboard.Layouts.HarmonicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.IsomorphicLayout.html">Duplex.Applications.Keyboard.Layouts.IsomorphicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.PianoLayout.html">Duplex.Applications.Keyboard.Layouts.PianoLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.html">Duplex.Applications.Keyboard</a></li>
  <li><a href="../modules/Duplex.Applications.Matrix.html">Duplex.Applications.Matrix</a></li>
  <li><a href="../modules/Duplex.Applications.Metronome.html">Duplex.Applications.Metronome</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.Bindings.html">Duplex.Applications.MidiActions.Bindings</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.html">Duplex.Applications.MidiActions</a></li>
  <li><a href="../modules/Duplex.Applications.Mixer.html">Duplex.Applications.Mixer</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_group.html">Duplex.Applications.Mlrx.Mlrx_group</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_note.html">Duplex.Applications.Mlrx.Mlrx_note</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_pos.html">Duplex.Applications.Mlrx.Mlrx_pos</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_track.html">Duplex.Applications.Mlrx.Mlrx_track</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.html">Duplex.Applications.Mlrx</a></li>
  <li><a href="../modules/Duplex.Applications.Navigator.html">Duplex.Applications.Navigator</a></li>
  <li><a href="../modules/Duplex.Applications.NotesOnWheels.html">Duplex.Applications.NotesOnWheels</a></li>
  <li><a href="../modules/Duplex.Applications.PatternCursor.html">Duplex.Applications.PatternCursor</a></li>
  <li><a href="../modules/Duplex.Applications.PatternSequence.html">Duplex.Applications.PatternSequence</a></li>
  <li><a href="../modules/Duplex.Applications.Recorder.html">Duplex.Applications.Recorder</a></li>
  <li><a href="../modules/Duplex.Applications.Repeater.html">Duplex.Applications.Repeater</a></li>
  <li><a href="../modules/Duplex.Applications.Rotate.html">Duplex.Applications.Rotate</a></li>
  <li><a href="../modules/Duplex.Applications.StepSequencer.html">Duplex.Applications.StepSequencer</a></li>
  <li><a href="../modules/Duplex.Applications.SwitchConfiguration.html">Duplex.Applications.SwitchConfiguration</a></li>
  <li><a href="../modules/Duplex.Applications.TestPad.html">Duplex.Applications.TestPad</a></li>
  <li><a href="../modules/Duplex.Applications.TrackSelector.html">Duplex.Applications.TrackSelector</a></li>
  <li><a href="../modules/Duplex.Applications.Transport.html">Duplex.Applications.Transport</a></li>
  <li><a href="../modules/Duplex.Applications.UIButtonTest.html">Duplex.Applications.UIButtonTest</a></li>
  <li><a href="../modules/Duplex.Applications.XYPad.html">Duplex.Applications.XYPad</a></li>
  <li><a href="../modules/Duplex.Automation.html">Duplex.Automation</a></li>
  <li><a href="../modules/Duplex.Browser.html">Duplex.Browser</a></li>
  <li><a href="../modules/Duplex.BrowserProcess.html">Duplex.BrowserProcess</a></li>
  <li><a href="../modules/Duplex.Canvas.html">Duplex.Canvas</a></li>
  <li><a href="../modules/Duplex.CanvasPoint.html">Duplex.CanvasPoint</a></li>
  <li><a href="../modules/Duplex.ControlMap.html">Duplex.ControlMap</a></li>
  <li><a href="../modules/Duplex.Device.html">Duplex.Device</a></li>
  <li><strong>Duplex.Display</strong></li>
  <li><a href="../modules/Duplex.Globals.html">Duplex.Globals</a></li>
  <li><a href="../modules/Duplex.Message.html">Duplex.Message</a></li>
  <li><a href="../modules/Duplex.MessageStream.html">Duplex.MessageStream</a></li>
  <li><a href="../modules/Duplex.MidiDevice.html">Duplex.MidiDevice</a></li>
  <li><a href="../modules/Duplex.OscClient.html">Duplex.OscClient</a></li>
  <li><a href="../modules/Duplex.OscDevice.html">Duplex.OscDevice</a></li>
  <li><a href="../modules/Duplex.OscVoiceMgr.html">Duplex.OscVoiceMgr</a></li>
  <li><a href="../modules/Duplex.Preferences.html">Duplex.Preferences</a></li>
  <li><a href="../modules/Duplex.ProcessSlicer.html">Duplex.ProcessSlicer</a></li>
  <li><a href="../modules/Duplex.RoamingDSP.html">Duplex.RoamingDSP</a></li>
  <li><a href="../modules/Duplex.Scheduler.html">Duplex.Scheduler</a></li>
  <li><a href="../modules/Duplex.StateController.html">Duplex.StateController</a></li>
  <li><a href="../modules/Duplex.UIButton.html">Duplex.UIButton</a></li>
  <li><a href="../modules/Duplex.UIButtonStrip.html">Duplex.UIButtonStrip</a></li>
  <li><a href="../modules/Duplex.UIComponent.html">Duplex.UIComponent</a></li>
  <li><a href="../modules/Duplex.UIKey.html">Duplex.UIKey</a></li>
  <li><a href="../modules/Duplex.UIKeyPressure.html">Duplex.UIKeyPressure</a></li>
  <li><a href="../modules/Duplex.UILabel.html">Duplex.UILabel</a></li>
  <li><a href="../modules/Duplex.UIPad.html">Duplex.UIPad</a></li>
  <li><a href="../modules/Duplex.UIPitchBend.html">Duplex.UIPitchBend</a></li>
  <li><a href="../modules/Duplex.UISlider.html">Duplex.UISlider</a></li>
  <li><a href="../modules/Duplex.UISpinner.html">Duplex.UISpinner</a></li>
  <li><a href="../modules/Duplex.WidgetHooks.html">Duplex.WidgetHooks</a></li>
  <li><a href="../modules/Duplex.WidgetKeyboard.html">Duplex.WidgetKeyboard</a></li>
  <li><a href="../modules/Duplex.html">Duplex</a></li>
  <li><a href="../modules/main.html">main</a></li>
</ul>

</div>

<div id="content">

<h1>Module <code>Duplex.Display</code></h1>
<p>The Display is the base class for device displays and the virtual UI</p>

<p>Display performs many duties; it manages UIComponents, as it will both send and recieve their messages, and take care of their visual updates on the idle time update.</p>
<p>
<p> </p>

<p>The Display will also build the control surface, an interactive representation of the device complete with native sliders, knobs etc. </p>



<h3>Changes</h3>

<p>  0.99.4</p>
<pre><code>- "skip_echo" is checked here, no more need to do so in output_value()
</code></pre>

<p>  0.99.3</p>
<pre><code>- "soft_echo", will update the hardware only when a message is _not_
  the result of a user action (a.k.a. a virtual event)
</code></pre>

<p>  0.99</p>
<pre><code>- Refactored 'UI widget' code into it's own Widget* classes
</code></pre>



<p>  0.98 </p>
<pre><code>- First release
</code></pre>

</p>


<h2><a href="#Functions">Functions</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#__init">__init (process)</a></td>
	<td class="summary">Initialize the Display class</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#add">add (obj_instance)</a></td>
	<td class="summary">Register a UIComponent with this display</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#clear">clear ()</a></td>
	<td class="summary">Clear display, force update of all UI components</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#apply_tooltips">apply_tooltips (group_name)</a></td>
	<td class="summary">Apply tooltips to UIComponents, based on their "tooltip" property</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#apply_midi_mappings">apply_midi_mappings (group_name)</a></td>
	<td class="summary">Apply MIDI mappings to UIComponents, based on the "midi_mapping" property</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#apply_to_objects">apply_to_objects (group_name, callback)</a></td>
	<td class="summary">Apply callback function to UIComponents, using wildcard syntax
 (e.g.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_active_state">set_active_state (state, group_name)</a></td>
	<td class="summary">Disable an entire section of the display
 (the enabled state of individual UIComponent is not affected)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#apply_to_groups">apply_to_groups (group_name, callback)</a></td>
	<td class="summary">Apply callback function to groups
 (e.g.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#get_group_dimensions">get_group_dimensions (group_name)</a></td>
	<td class="summary">figure out the physical dimensions of a given group</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#update">update (foo)</a></td>
	<td class="summary">Update any UIComponent that has been modified since the last update
 (called continously)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#set_parameter">set_parameter (param, ui_obj, point, skip_ui)</a></td>
	<td class="summary">Set_parameter: apply parameter changes, update the display</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#build_control_surface">build_control_surface ()</a></td>
	<td class="summary">Build the virtual control-surface (based on the parsed control-map)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#generate_message">generate_message (value, param, released)</a></td>
	<td class="summary">Generate messages for the virtual control-surface (creates a
 <a href="../modules/Duplex.Message.html#">Duplex.Message</a> which is then passed into a <a href="../modules/Duplex.MessageStream.html#">Duplex.MessageStream</a>).</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_walk_table">_walk_table (t, done, deep)</a></td>
	<td class="summary">Walk control-map defition, and create the virtual control surface</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_validate_group">_validate_group (xarg)</a></td>
	<td class="summary">Validate/fix groups and try to give the control map author some
 hints of what might be wrong with the control map</td>
	</tr>
</table>
<h2><a href="#Tables">Tables</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#canvas_background">canvas_background</a></td>
	<td class="summary">(table) define the visual appearance of 'empty space', used e.g.</td>
	</tr>
</table>
<h2><a href="#Fields">Fields</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#self.process">self.process</a></td>
	<td class="summary">(<a href="../modules/Duplex.BrowserProcess.html#">Duplex.BrowserProcess</a>)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.device">self.device</a></td>
	<td class="summary">(<a href="../modules/Duplex.Device.html#">Duplex.Device</a>)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.vb">self.vb</a></td>
	<td class="summary">(renoise.ViewBuilder)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.view">self.view</a></td>
	<td class="summary">(renoise.Views.View)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.ui_objects">self.ui_objects</a></td>
	<td class="summary">(table) associated UIComponent instances</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.ui_notifiers">self.ui_notifiers</a></td>
	<td class="summary">(table) each UI object notifier method is referenced by id,
 so we can attach/detach the method on the fly (this is done
 when we need to change the UI Object's value)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.scheduler">self.scheduler</a></td>
	<td class="summary">(<a href="../modules/Duplex.Scheduler.html#">Duplex.Scheduler</a>) use scheduler to perform periodic updates</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.state_ctrl">self.state_ctrl</a></td>
	<td class="summary">(<a href="../modules/Duplex.StateController.html#">Duplex.StateController</a>) handle display states
 (this is added immediately after initializing the Display, as we
 need a valid reference to ourselves - search for "StateApplication")</td>
	</tr>
</table>

<br/>
<br/>


    <h2><a name="Functions"></a>Functions</h2>
    <dl class="function">
    <dt>
    <a name = "__init"></a>
    <strong>__init (process)</strong>
    </dt>
    <dd>
    Initialize the Display class


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">process</span>
         (<a href="../modules/Duplex.BrowserProcess.html#">Duplex.BrowserProcess</a>)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "add"></a>
    <strong>add (obj_instance)</strong>
    </dt>
    <dd>
    Register a UIComponent with this display


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">obj_instance</span>
         (<a href="../modules/Duplex.UIComponent.html#">Duplex.UIComponent</a>)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "clear"></a>
    <strong>clear ()</strong>
    </dt>
    <dd>
    Clear display, force update of all UI components







</dd>
    <dt>
    <a name = "apply_tooltips"></a>
    <strong>apply_tooltips (group_name)</strong>
    </dt>
    <dd>
    Apply tooltips to UIComponents, based on their "tooltip" property


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">group_name</span>
        [opt] (string or nil), e.g. "Pads<em>1" or "Pads</em>*" (leave out to match all)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "apply_midi_mappings"></a>
    <strong>apply_midi_mappings (group_name)</strong>
    </dt>
    <dd>
    Apply MIDI mappings to UIComponents, based on the "midi_mapping" property


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">group_name</span>
        [opt] (string or nil), e.g. "Pads<em>1" or "Pads</em>*" (leave out to match all)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "apply_to_objects"></a>
    <strong>apply_to_objects (group_name, callback)</strong>
    </dt>
    <dd>
    Apply callback function to UIComponents, using wildcard syntax
 (e.g.  for specifying tooltips, midi mappings etc.)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">group_name</span>
        [opt] (string or nil), e.g. "Pads<em>1" or "Pads</em>*" (leave out to match all)
        </li>
        <li><span class="parameter">callback</span>
         (func) function to apply to matched components
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_active_state"></a>
    <strong>set_active_state (state, group_name)</strong>
    </dt>
    <dd>
    Disable an entire section of the display
 (the enabled state of individual UIComponent is not affected)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">state</span>
         (bool) enabled when true, disabled when false
        </li>
        <li><span class="parameter">group_name</span>
        [opt] (string or nil), leave out to match all
[[
        </li>
    </ul>





</dd>
    <dt>
    <a name = "apply_to_groups"></a>
    <strong>apply_to_groups (group_name, callback)</strong>
    </dt>
    <dd>
    Apply callback function to groups
 (e.g.  for quickly disabling entire, or partial display)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">group_name</span>
        [opt] (string or nil), leave out to match all
        </li>
        <li><span class="parameter">callback</span>
         (func) function to apply to matched groups
        </li>
    </ul>





</dd>
    <dt>
    <a name = "get_group_dimensions"></a>
    <strong>get_group_dimensions (group_name)</strong>
    </dt>
    <dd>
    figure out the physical dimensions of a given group


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">group_name</span>
         (string) control-map group name
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>
        <li>
        width (int)</li>
        <li>
        height (int)
[[</li>
    </ol>




</dd>
    <dt>
    <a name = "update"></a>
    <strong>update (foo)</strong>
    </dt>
    <dd>
    Update any UIComponent that has been modified since the last update
 (called continously)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">foo</span>
        TRACE("<em>*</em> Display.update",foo)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "set_parameter"></a>
    <strong>set_parameter (param, ui_obj, point, skip_ui)</strong>
    </dt>
    <dd>
    Set_parameter: apply parameter changes, update the display


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">param</span>
         (table) control-map definition of the element
        </li>
        <li><span class="parameter">ui_obj</span>
         (<a href="../modules/Duplex.UIComponent.html#">Duplex.UIComponent</a>)
        </li>
        <li><span class="parameter">point</span>
         (<a href="../modules/Duplex.CanvasPoint.html#">Duplex.CanvasPoint</a>) text/value/color
        </li>
        <li><span class="parameter">skip_ui</span>
         (bool) true when we are sending subparameters
        </li>
    </ul>





</dd>
    <dt>
    <a name = "build_control_surface"></a>
    <strong>build_control_surface ()</strong>
    </dt>
    <dd>
    Build the virtual control-surface (based on the parsed control-map)



    <h3>Returns:</h3>
    <ol>

        renoise.Views.View
    </ol>




</dd>
    <dt>
    <a name = "generate_message"></a>
    <strong>generate_message (value, param, released)</strong>
    </dt>
    <dd>
    Generate messages for the virtual control-surface (creates a
 <a href="../modules/Duplex.Message.html#">Duplex.Message</a> which is then passed into a <a href="../modules/Duplex.MessageStream.html#">Duplex.MessageStream</a>). </p>

<p> Similar to <a href="../modules/Duplex.Device.html#_send_message">Duplex.Device._send_message</a>, except that here we
 need to create everything (value, midi message, etc.) from scratch


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">value</span>
         (number or table) value, or table of values
        </li>
        <li><span class="parameter">param</span>
         (table) <code>Param</code> node attributes, see <a href="../modules/Duplex.ControlMap.html#">Duplex.ControlMap</a>
        </li>
        <li><span class="parameter">released</span>
         (bool), true when button has been released
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_walk_table"></a>
    <strong>_walk_table (t, done, deep)</strong>
    </dt>
    <dd>
    Walk control-map defition, and create the virtual control surface


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">t</span>
         (table) the control-map defition
        </li>
        <li><span class="parameter">done</span>
         (table) internal calculation table
        </li>
        <li><span class="parameter">deep</span>
         (int) the nesting level
        </li>
    </ul>





</dd>
    <dt>
    <a name = "_validate_group"></a>
    <strong>_validate_group (xarg)</strong>
    </dt>
    <dd>
    Validate/fix groups and try to give the control map author some
 hints of what might be wrong with the control map


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">xarg</span>
         (table) the control-map attributes
        </li>
    </ul>





</dd>
</dl>
    <h2><a name="Tables"></a>Tables</h2>
    <dl class="function">
    <dt>
    <a name = "canvas_background"></a>
    <strong>canvas_background</strong>
    </dt>
    <dd>
    (table) define the visual appearance of 'empty space', used e.g.
  when we remove a given point due to resizing


    <h3>Fields:</h3>
    <ul>
        <li><span class="parameter">text</span>
         (string)
        </li>
        <li><span class="parameter">color</span>
         (table)
        </li>
        <li><span class="parameter">val</span>
         (bool)
        </li>
    </ul>





</dd>
</dl>
    <h2><a name="Fields"></a>Fields</h2>
    <dl class="function">
    <dt>
    <a name = "self.process"></a>
    <strong>self.process</strong>
    </dt>
    <dd>
    (<a href="../modules/Duplex.BrowserProcess.html#">Duplex.BrowserProcess</a>)







</dd>
    <dt>
    <a name = "self.device"></a>
    <strong>self.device</strong>
    </dt>
    <dd>
    (<a href="../modules/Duplex.Device.html#">Duplex.Device</a>)







</dd>
    <dt>
    <a name = "self.vb"></a>
    <strong>self.vb</strong>
    </dt>
    <dd>
    (renoise.ViewBuilder)







</dd>
    <dt>
    <a name = "self.view"></a>
    <strong>self.view</strong>
    </dt>
    <dd>
    (renoise.Views.View)







</dd>
    <dt>
    <a name = "self.ui_objects"></a>
    <strong>self.ui_objects</strong>
    </dt>
    <dd>
    (table) associated UIComponent instances







</dd>
    <dt>
    <a name = "self.ui_notifiers"></a>
    <strong>self.ui_notifiers</strong>
    </dt>
    <dd>
    (table) each UI object notifier method is referenced by id,
 so we can attach/detach the method on the fly (this is done
 when we need to change the UI Object's value)







</dd>
    <dt>
    <a name = "self.scheduler"></a>
    <strong>self.scheduler</strong>
    </dt>
    <dd>
    (<a href="../modules/Duplex.Scheduler.html#">Duplex.Scheduler</a>) use scheduler to perform periodic updates







</dd>
    <dt>
    <a name = "self.state_ctrl"></a>
    <strong>self.state_ctrl</strong>
    </dt>
    <dd>
    (<a href="../modules/Duplex.StateController.html#">Duplex.StateController</a>) handle display states
 (this is added immediately after initializing the Display, as we
 need a valid reference to ourselves - search for "StateApplication")







</dd>
</dl>


</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>
